14. Copy On Resource Manage Class

void lock(Mutex* pm); // Mutext
void unlock(Mutex* pm); // Mutext
class Lock{
public:
explicit Lock(Mutex* pm): mutexPtr(pm){
lock(mutexPtr);
}
~Lock(){
unlock(mutexPtr);
}
private:
Mutex* mutexPtr;
};
int main(void){
Mutex m;
// ...
{ // ()
Lock m1(&m);
// ...
} // Lock m1
}
하지만, 도중에 Mutex가 복사되는 경우
Lock ml1(&m); //
Lock ml2(ml1); //
아래와 같이 RAII 클래스의 복사에 대한 프로세스를 제한할 수 있다.
1. 복사를 금지
2. 관리하고 있는 자원에 대한 참조 카운팅
3. 관리하고 있는 자원을 복사함
4. 관리하고 있는 자원의 소유권을 이전
1. 복사를 금지
복사 생성자와 복사 대입 연산자(복사 연산 함수)를 private 멤버로 만든다.
class Uncopyable{
protected:
Uncopyable(){}
~Uncopyable(){}
private:
Uncopyable(const Uncopyalbe&);
Uncopyable& operator=(const Uncopyable&);
};
class Lock: private Uncopyable{
public:
// ...
};
2. 관리하고 있는 자원에 대한 참조 카운팅
shared_ptr도 내부적으로 참조 카운팅을 하고 있다.
shared_ptr은 삭제자(deleter) 지정을 허용한다.
class Lock{
public:
explicit Lock(Mutex* pm): mutexPtr(pm, unlock){
lock(mutexPtr.get());
} // unlock
private:
std::shared_ptr<Mutex> mutexPtr;
};
3. 관리하고 있는 자원 복사
깊은 복사(deep copy)
4. 관리하고 있는 자원의 소유권을 이전
unique_ptr 사용